// Package main 演示GORM的高级查询操作，包括复杂条件查询、子查询和关联查询等功能
// 本示例展示了GORM提供的丰富查询条件构建能力，满足各种复杂查询场景
package main

import (
	"fmt"
	"gin-gorm/global"
	"gin-gorm/models"
)

// main 程序入口函数，演示GORM的各种高级查询操作
func main() {
	// 初始化数据库连接
	global.Connect()

	// Where条件查询
	// 基本的条件查询，支持使用占位符防止SQL注入
	// var users []models.UserModel
	// global.DB.Where("age > ? and name like ?", 20, "%枫%").Find(&users) // 查询年龄大于20且名字包含"枫"的用户
	// fmt.Println(users)

	// OR条件查询
	// 使用Or方法添加或条件，可以组合多个条件
	// global.DB.Where("age = ?", 20).Or("age = ?", 25).Find(&users) // 查询年龄为20或25的用户
	// fmt.Println(users)

	// NOT条件查询
	// 使用Not方法添加非条件，排除符合特定条件的记录
	// global.DB.Not("age = ?", 20).Find(&users) // 查询年龄不等于20的用户
	// fmt.Println(users)

	// IN条件查询
	// 使用IN操作符查询字段值在指定集合中的记录
	// global.DB.Where("age IN ?", []int{20, 21, 22}).Find(&users) // 查询年龄为20、21或22的用户
	// fmt.Println(users)

	// LIKE条件查询
	// 使用LIKE操作符进行模糊匹配查询
	// global.DB.Where("name LIKE ?", "%枫%").Find(&users) // 查询名字包含"枫"的用户
	// fmt.Println(users)

	// BETWEEN条件查询
	// 使用BETWEEN操作符查询字段值在指定范围内的记录
	// global.DB.Where("age BETWEEN ? AND ?", 20, 30).Find(&users) // 查询年龄在20到30之间的用户
	// fmt.Println(users)

	// 时间条件查询
	// 支持时间类型字段的条件查询
	// global.DB.Where("created_at > ?", "2023-01-01").Find(&users) // 查询创建时间在2023-01-01之后的用户
	// fmt.Println(users)

	// 嵌套查询
	// 在查询条件中嵌套另一个查询
	// global.DB.Where("id IN (?) ", global.DB.Table("users").Select("id").Where("age > ?", 20)).Find(&users) // 查询ID在子查询结果中的用户
	// fmt.Println(users)

	// 子查询
	// 在SELECT子句中包含子查询
	// var result []map[string]interface{} // 使用map切片存储包含聚合结果的查询
	// global.DB.Table("users u").Select("u.name, (SELECT count(*) FROM users WHERE age = u.age) as count").Group("u.name").Scan(&result) // 查询每个用户及其同龄人的数量
	// fmt.Println(result)

	// 原生SQL查询
	// 直接使用原生SQL语句进行查询
	// global.DB.Raw("SELECT * FROM users WHERE age > ?", 20).Scan(&users) // 执行原生SQL查询
	// fmt.Println(users)

	// 多表关联查询
	// 使用Joins方法进行表连接查询
	// var result []map[string]interface{} // 使用map切片存储跨表查询结果
	// global.DB.Table("users").Select("users.name, user_details.address").Joins("left join user_details on users.id = user_details.user_id").Scan(&result) // 左连接查询用户和其详细信息
	// fmt.Println(result)
}
